function convert(input) { alert('Error. Contact us if this keeps happening.'); document.getElementById('modal-contact').classList.add('show'); } var _ggStops = [ { color: '#2d7a2d', position: 0 }, { color: '#1f8233', position: 100 } ]; var _ggBuilt = false; function _ggClamp(v, min, max) { return Math.max(min, Math.min(max, v)); } function _ggSortStops() { _ggStops.sort(function(a, b) { return a.position - b.position; }); } function _ggBuildCss() { _ggSortStops(); var type = document.getElementById('gg-type').value; var parts = _ggStops.map(function(s) { return s.color + ' ' + s.position + '%'; }); if (type === 'radial') { var shape = document.getElementById('gg-radial-shape').value; return 'radial-gradient(' + shape + ' at center, ' + parts.join(', ') + ')'; } var angle = parseInt(document.getElementById('gg-angle').value, 10); if (!isFinite(angle)) angle = 135; return 'linear-gradient(' + angle + 'deg, ' + parts.join(', ') + ')'; } function _ggRenderStops() { var host = document.getElementById('gg-stops'); if (!host) return; host.innerHTML = ''; _ggStops.forEach(function(stop, idx) { var row = document.createElement('div'); row.className = 'gg-stop'; var color = document.createElement('input'); color.type = 'color'; color.value = stop.color; color.setAttribute('aria-label', 'Stop ' + (idx + 1) + ' color'); color.addEventListener('input', function() { _ggStops[idx].color = color.value; _ggRender(); }); row.appendChild(color); var slider = document.createElement('input'); slider.type = 'range'; slider.min = '0'; slider.max = '100'; slider.step = '1'; slider.value = String(stop.position); slider.className = 'gg-pos-slider'; slider.setAttribute('aria-label', 'Stop ' + (idx + 1) + ' position'); slider.addEventListener('input', function() { _ggStops[idx].position = _ggClamp(parseInt(slider.value, 10) || 0, 0, 100); num.value = String(_ggStops[idx].position); _ggRender(); }); row.appendChild(slider); var num = document.createElement('input'); num.type = 'number'; num.min = '0'; num.max = '100'; num.value = String(stop.position); num.setAttribute('aria-label', 'Stop ' + (idx + 1) + ' position %'); num.addEventListener('input', function() { var v = _ggClamp(parseInt(num.value, 10) || 0, 0, 100); _ggStops[idx].position = v; slider.value = String(v); _ggRender(); }); row.appendChild(num); var pct = document.createElement('span'); pct.textContent = '%'; pct.style.color = '#5f6a64'; pct.style.fontSize = '0.85rem'; row.appendChild(pct); if (_ggStops.length > 2) { var rm = document.createElement('button'); rm.type = 'button'; rm.className = 'gg-remove'; rm.title = 'Remove this color stop'; rm.setAttribute('aria-label', 'Remove stop ' + (idx + 1)); rm.innerHTML = ''; rm.addEventListener('click', function() { _ggStops.splice(idx, 1); _ggRender(); }); row.appendChild(rm); } host.appendChild(row); }); } function _ggRender() { var css = _ggBuildCss(); var preview = document.getElementById('gg-preview'); if (preview) preview.style.background = css; var out = document.getElementById('box2'); if (out) { out.value = 'background: ' + css + ';\nbackground-image: ' + css + ';'; } var input = document.getElementById('box1'); if (input && !input.value) { input.value = css; } try { if (typeof writeCharacterAndWordCount === 'function') writeCharacterAndWordCount(); } catch (e) {} } function _ggInit() { if (_ggBuilt) return; _ggBuilt = true; _ggRenderStops(); document.getElementById('gg-type').addEventListener('change', function() { var isRadial = this.value === 'radial'; document.getElementById('gg-angle-row').style.display = isRadial ? 'none' : ''; document.getElementById('gg-radial-row').style.display = isRadial ? '' : 'none'; _ggRender(); }); var angleSlider = document.getElementById('gg-angle'); var angleLabel = document.getElementById('gg-angle-label'); angleSlider.addEventListener('input', function() { angleLabel.textContent = this.value + '°'; _ggRender(); }); document.getElementById('gg-radial-shape').addEventListener('change', _ggRender); document.getElementById('gg-add').addEventListener('click', function() { if (_ggStops.length >= 10) { alert('Up to 10 color stops are supported.'); return; } var maxPos = 0; for (var i = 0; i < _ggStops.length; i++) maxPos = Math.max(maxPos, _ggStops[i].position); var newPos = Math.min(100, maxPos + 10); _ggStops.push({ color: '#ffaa44', position: newPos }); _ggRenderStops(); _ggRender(); }); _ggRender(); } function convert(input) { return document.getElementById('box2') ? document.getElementById('box2').value : ''; } document.addEventListener('DOMContentLoaded', _ggInit); if (document.readyState !== 'loading') _ggInit(); var _loadedScripts = {}; function loadScriptPromise(url) { if (_loadedScripts[url]) return _loadedScripts[url]; _loadedScripts[url] = new Promise(function (resolve, reject) { var s = document.createElement('script'); s.src = url; s.onload = resolve; s.onerror = reject; document.head.appendChild(s); }); return _loadedScripts[url]; } function replaceAll(find, replace, str) { return str.replace(new RegExp(find, 'g'), replace); } function beautify(str) { var result = ''; var length = str.length; var i = 0; var braceCountLeft = 0; var braceCountRight = 0; var withinQuotes = false; while (i < length) { var c = str[i]; if (c == '"' && (i == 0 || c[i - 1] != '\\')) { // non-escaped quotes withinQuotes = !withinQuotes; } if (!withinQuotes && (c == '}' || c == '{' || c == ',')) { console.log('Start####' + result); // look back and remove carriage returns and whitespace that are already there var resultIndex = result.length - 1; while (resultIndex >= 0 && (result[resultIndex] == ' ' || result[resultIndex] == '\r' || result[resultIndex] == '\n' || result[resultIndex] == '\t')) { resultIndex = resultIndex - 1; result = result.substr(0, resultIndex + 1); console.log('char ' + result[resultIndex] + '-----' + result + 'zzz ' + result.length + ' ' + resultIndex); } if (c == '{') { braceCountLeft++; result += c + '\r' + GetTabs(braceCountLeft - braceCountRight); } else if (c == '}') { braceCountRight++; // precede with carriage return result += '\r' + GetTabs(braceCountLeft - braceCountRight) + c; } else if (c == ',') { result += c + '\r' + GetTabs(braceCountLeft - braceCountRight); } var nextChar = ''; // advance through whitespace and remove carriage returns that are already there while (i < length && (str[i + 1] == ' ' || str[i + 1] == '\r' || str[i + 1] == '\n' || str[i + 1] == '\t')) { i++; } } else { result += str[i]; } i++; } return result; } function GetTabs(count) { var result = ''; for (var i = 0; i < count; i++) { result += ' '; } return result; }